#pragma once
#include <vector>
#include <math.h>
#include "Matrix.h"
class Vector
{
    size_t _dim;
    std::vector<long double> _vec;
public:
    Vector(size_t);
    Vector(long double, long double);
    Vector(long double, long double, long double);
    Vector(size_t, std::vector<long double>);
    Vector(size_t, const long double*);
    Vector(const Vector&);
    size_t dim() const;
    long double mag();
    long double& operator[](size_t i);
    long double& at(size_t i);
    long double direction();
    Vector UnitVec();
};

extern const Vector i;
extern const Vector j;
extern const Vector i3;
extern const Vector j3;
extern const Vector k3;

long double VecAng(Vector a, Vector b);

Vector operator+ (Vector a, Vector b);
Vector operator- (Vector a);
Vector operator- (Vector a, Vector b);
Vector operator* (double a, Vector b);
Vector operator* (Vector b, double a);
long double operator* (Vector a, Vector b);
Vector operator/ (Vector b, double a);
Vector operator^ (Vector a, Vector b);

Vector Cross(Vector a, Vector b);

Matrix RowVec(Vector Vec);
Matrix ColVec(Vector Vec);
Vector Rotate(Vector Vec, long double alpha);